package com.jasmine.bjstkserver.manager.os;

import com.jasmine.auth.util.AuthUtil;
import com.jasmine.core.constants.enums.DictEnum;
import com.jasmine.bjstkserver.server.dict.DictService;
import com.jasmine.core.util.AopTargetUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * OS策略类
 * @author jasmineXz
 */
@Primary
@Component
public class OsManagerStrategy implements OsManager {
    private static final String OS_TYPE_DICT_NAME = "OSTYPE";

    /**
     * os bean map
     */
    private static final Map<String,OsManager> OS_MAP = new HashMap<>();

    @Autowired
    private DictService dictService;


    /**
     * 初始化策略对象
     */
    public OsManagerStrategy(List<OsManager> osManagers) {
        osManagers.forEach(os -> {
            try {
                OS_MAP.put(AopTargetUtil.getTarget(os).getClass().getName(),os);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }


    /**
     * 上传文件
     * @param inputStream 输入流
     * @param fileName 文件名
     * @return 上传后路径
     */
    @Override
    public String put(InputStream inputStream, String fileName) {
        return getOsInstance().put(inputStream,fileName);
    }


    /**
     * 异步上传文件[未完成异步,此处为非HTTP请求线程上传文件]
     * @param inputStream 文件流
     * @param fileName 文件名
     * @param userId 用户ID,用于获取该用户字典
     * @return 上传后路径
     */
    @Override
    public String putAsync(InputStream inputStream, String fileName, Integer userId) {
        return getOsInstance(userId).putAsync(inputStream,fileName,userId);
    }


    /**
     * 上传文件
     * @param file 文件
     * @param fileName 文件名
     * @return 上传后路径
     */
    @Override
    public String put(MultipartFile file, String fileName) {
        return getOsInstance().put(file,fileName);
    }


    /**
     * 异步删除
     * @param fileName 文件名称
     * @param userId 用户ID
     */
    @Override
    public void deleteAsync(String fileName, Integer userId) {
        getOsInstance(userId).deleteAsync(fileName,userId);
    }


    /**
     * 获取当前请求用户的OS实例
     * @return OS实例
     */
    private OsManager getOsInstance () {
        return getOsBean(AuthUtil.getUserId());
    }

    /**
     * 获取某个用户指定的OS实例
     * @param userId 用户ID
     * @return OS实例
     */
    private OsManager getOsInstance (Integer userId) {
        return getOsBean(userId);
    }


    /**
     * 获取OS BEAN
     * @param userId 用户ID
     * @return OS实例
     */
    private OsManager getOsBean (Integer userId) {
        String osType = dictService.getDictValue(DictEnum.OSTYPE.code(),OS_TYPE_DICT_NAME,userId);
        String className = OsTypeEnum.getClassName(osType);
        return OS_MAP.get(className);
    }


}
